package edu.corn.statemachine.core;


import edu.corn.statemachine.core.context.IStateContext;

/**
 * 状态机接口
 *
 * @param <S> 状态，状态只能在给定的目标中流转
 * @param <E> 事件，在给定事件中流转
 */
public interface StateMachine<S extends Enum<S>, E extends Enum<E>> {

    /**
     * 向状态机发送消息，以供流转。
     * 没有原始状态，所以需要能够定位到唯一的行为。
     *
     * @param context 携带的消息上下文。
     */
    void sendEvent(IStateContext<S, E> context);

    /**
     * 有源状态的事件。
     *
     * @param sourceState 源状态。
     * @param context     上下文信息。
     */
    void sendEvent(S sourceState, IStateContext<S, E> context);




}
